import OperateTypeEnum from '@/enums/OperateTypeEnum'
import { diffSecond } from '@/utils/datetime'
import { ElMessage } from 'element-plus'

/**
 * 深度拷贝
 * @param source
 */
export function deepClone(source) {
  if (!source && typeof source !== 'object') {
    throw new Error('error arguments')
  }
  const targetObj = source.constructor === Array ? [] : {}
  Object.keys(source).forEach((keys) => {
    if (source[keys] && typeof source[keys] === 'object') {
      targetObj[keys] = deepClone(source[keys])
    } else {
      targetObj[keys] = source[keys]
    }
  })
  return targetObj
}

export class OpenMessage {
  /**
   * 记录上一次请求时间, 两次请求之间不超过 2 秒 第二次请求不弹出提示信息
   * 避免两次弹框相隔时间太短，使得看起来有一种页面抖动的感觉
   */
  static lastRequest = {
    type: OperateTypeEnum.QUERY,
    time: new Date(),
  }

  /**
   * 打开弹框提示
   * 两次请求之间不超过 2 秒 第二次请求不弹出提示信息, 如果第二次请求是失败信息就弹框提示
   *
   * @param success 成功true OR 失败false
   * @param msg     提示内容
   * @param operateType 本次请求类型
   */
  static openElMessage(success, msg, operateType) {
    let currentTime = new Date()
    // 判断请求是否成功且两次请求相隔时间是不是小于2秒, 小于2秒就不弹框
    if (success && diffSecond(currentTime, OpenMessage.lastRequest.time) < 2) {
      console.log('请求时间小于2s')
      // 有时候2秒之内上一个是查询请求，下一个是增删改请求，这时不会有增删改成功提示，只有查询成功提示
      // 所以再加上一个请求类型条件，2秒之内，查询请求不再弹框, 增删改请求会弹框
      if (operateType === OperateTypeEnum.QUERY.value) {
        console.log('上次请求是QUERY')
        return
      } else {
        // 不是查询请求的情况下，如果是多次增删改请求，那么请求类型一样的情况下也不弹框，
        if (operateType === OpenMessage.lastRequest.type) {
          return
        }
      }
    }
    // 弹框提示之前先关闭之前的弹框提示，避免一个页面出现多个弹框提示
    ElMessage.closeAll()
    if (success) {
      ElMessage.success(msg)
    } else {
      ElMessage.error(msg)
    }
    // 记录本次请求类型与时间
    OpenMessage.lastRequest.type = operateType
    OpenMessage.lastRequest.time = currentTime
  }
}
